LET PASSESSTRUCOUT() BE
 $( STATIC $( NDNUM = NIL; TRANLST = NIL; LNODES = NIL $);

 LET PASSCTEOUT(CTE) BE
  $( STATIC $( CTENUM = NIL; HR = NIL; HMIN = NIL; HMAX = NIL;
               PARENFLAG = NIL $);

  LET OUTATNAME(STRNUM) BE
   $(
   OUTSNUM(STRNUM);
   SPACES(1);
   OUTNOS(HMIN);
   OUTNOS(HMAX)
   $);

  LET OUTNBR(NBR) BE
   $( STATIC $( TNBR = NIL $);
   IF NBR=0 DO RETURN;
   TNBR:=CDR(ASSOC(NBR,TRANLST));
   OUTNOS((ANYBENTRY(NBR,CTENUM)=@NULL -> TNBR,-TNBR));
   $);

  CTENUM:=FETCH(CTE.NUM,CTE);
  PARENFLAG:=POLYP(CTE) BITOR TAGP(CTE);
  IF PARENFLAG DO OUTS("( ");
  IF TAGP(CTE) DO OUTS("** ");
  HR:=FETCH(CTE.HR,CTE);
  HMIN:=CAR(HR);
  HMAX:=CDR(HR);
  IF HMIN>HMAX DO $( HMIN:=0; HMAX:=100 $);
  MAPC(FETCH(CTE.ATS,CTE),OUTATNAME);
  IF PARENFLAG DO OUTS(") ");
  OUTNOS((ARSPECP(CTE) -> (ARP(CTE) -> 2,1),3));
  test HYBRIDSPECP(CTE) then $(outhyb
	/* Need to get hybrid code, it seem simplest to mask out correct
        bits and shift them right. If nothing specified, hybrid code is
        15 (decimal) meaning all bits allowed.
        */
        static $( HYBS = NIL $);
        HYBS:=SP3MARK+SP2MARK+SP1AMARK+SP1BMARK;
        HYBS:=(HYBS BITAND FETCH(CTE.MARKS,CTE))
        HYBS:=HYBS >> 5
        OUTNOS(HYBS)
	$)outhyb
  or OUTS("15 ");
  test COLOURP(CTE) then $(outcol
     OUTNOS(FETCH(CTE.COLOURS,CTE))
     $)outcol
  or OUTNOS(#7777)


  MAPC(FETCH(CTE.NBRS,CTE),OUTNBR);
  OUTNOL(0);
  IF LNP(CTE) DO
   LNODES:=CONS(CONS(CDR(ASSOC(CTENUM,TRANLST)),FETCH(CTE.LR,CTE)),LNODES)
  $);

 LET TRANENTRY(CTE) = VALOF
  $(
  NDNUM:=NDNUM+1;
  RESULTIS CONS(FETCH(CTE.NUM,CTE),NDNUM)
  $);

 LET LNODEOUT(LNENTRY) BE
  $( STATIC $( LR = NIL $);
  OUTNOS(CAR(LNENTRY));
  LR:=CDR(LNENTRY);
  UNCONS(LNENTRY);
  OUTNOS(CAR(LR));
  OUTNOL(CDR(LR))
  $);

 NDNUM:=0;
 TRANLST:=MAPCAR(CTELIST,TRANENTRY);
 LNODES:=@NULL;
 MAPC(CTELIST,PASSCTEOUT);
 OUTNOL(LENGTH(LNODES));
 MAPC(LNODES,LNODEOUT);
 UNLIST(LNODES);
 MAPC(TRANLST,UNCONS);
 UNLIST(TRANLST)
 $);
